/*     */ package competitie;
/*     */ 
/*     */ import java.io.PrintStream;
/*     */ 
/*     */ public class SpeelCompetitie
/*     */ {
/*     */   private static final int GETESTTE_RICHTINGEN = 2;
/*     */   private static final int PUNTEN_PER_GEWONNNEN_TEST = 2;
/*     */   private Strategie[] spelers;
/*     */   private int spellenPerTest;
/*     */   private int aantalSpelers;
/*     */   private int[][] results;
/*     */   private double[][] normalizedResults;
/*     */   private int totaalAantalSpellen;
/*     */ 
/*     */   public SpeelCompetitie(CompetitieInterface competitie, int spellenPerTest)
/*     */   {
/*  22 */     this.spelers = competitie.geefSpelers();
/*  23 */     this.spellenPerTest = spellenPerTest;
/*  24 */     this.aantalSpelers = this.spelers.length;
/*  25 */     if (this.aantalSpelers <= 1) {
/*  26 */       System.out.printf("Minimaal 2 spelers meegeven\n", new Object[0]);
/*  27 */       return;
/*     */     }
/*  29 */     this.totaalAantalSpellen = (this.aantalSpelers * (this.aantalSpelers - 1) * spellenPerTest);
/*  30 */     this.results = new int[this.aantalSpelers][this.aantalSpelers];
/*  31 */     this.normalizedResults = new double[this.aantalSpelers][this.aantalSpelers];
/*     */ 
/*  33 */     initIntMatrix(this.results);
/*  34 */     initDoubleMatrix(this.normalizedResults);
/*     */ 
/*  36 */     startSpellen();
/*  37 */     normaliseerResultaat();
/*  38 */     printResults();
/*     */   }
/*     */ 
/*     */   private void printResults() {
/*  42 */     System.out.printf("\nTo be interpreted: the AI's on the rows won x percent of those on the columns\n\n", new Object[0]);
/*  43 */     System.out.printf("      ", new Object[0]);
/*  44 */     for (int i = 0; i < this.aantalSpelers; i++) {
/*  45 */       System.out.printf("%6d", new Object[] { Integer.valueOf(i) });
/*     */     }
/*  47 */     System.out.printf("  Average*\n", new Object[0]);
/*  48 */     for (int i = 0; i < this.aantalSpelers; i++) {
/*  49 */       System.out.printf("%6d", new Object[] { Integer.valueOf(i) });
/*  50 */       for (int j = 0; j < this.aantalSpelers; j++) {
/*  51 */         System.out.printf("%6.1f", new Object[] { Double.valueOf(this.normalizedResults[i][j]) });
/*     */       }
/*  53 */       System.out.printf("%10.2f", new Object[] { Double.valueOf(calculateAverageSpecial(this.normalizedResults[i], -1)) });
/*  54 */       System.out.printf("\n", new Object[0]);
/*     */     }
/*  56 */     System.out.print("\n*: excludes the 0 from matches against self\n");
/*     */   }
/*     */ 
/*     */   private double calculateAverageSpecial(double[] doubleArray, int divisionCorrection)
/*     */   {
/*  61 */     if (divisionCorrection * -1 >= doubleArray.length) {
/*  62 */       return 0.0D;
/*     */     }
/*  64 */     double result = 0.0D;
/*  65 */     for (int i = 0; i < doubleArray.length; i++) {
/*  66 */       result += doubleArray[i];
/*     */     }
/*  68 */     return result / (doubleArray.length + divisionCorrection);
/*     */   }
/*     */ 
/*     */   private void normaliseerResultaat() {
/*  72 */     int aantalGespeeldeSpellen = this.spellenPerTest * 2 * 2;
/*  73 */     for (int i = 0; i < this.aantalSpelers; i++)
/*  74 */       for (int j = 0; j < this.aantalSpelers; j++)
/*  75 */         this.normalizedResults[i][j] = (aantalGespeeldeSpellen <= 0 ? 0.0D : this.results[i][j] / aantalGespeeldeSpellen * 100.0D);
/*     */   }
/*     */ 
/*     */   private void initDoubleMatrix(double[][] matrix)
/*     */   {
/*  81 */     for (int i = 0; i < matrix.length; i++)
/*  82 */       for (int j = 0; j < matrix[i].length; j++)
/*  83 */         matrix[i][j] = 0.0D;
/*     */   }
/*     */ 
/*     */   private void initIntMatrix(int[][] matrix)
/*     */   {
/*  89 */     for (int i = 0; i < matrix.length; i++)
/*  90 */       for (int j = 0; j < matrix[i].length; j++)
/*  91 */         matrix[i][j] = 0;
/*     */   }
/*     */ 
/*     */   private void startSpellen()
/*     */   {
/*  97 */     int gespeeldeSetSpellen = 0;
/*  98 */     for (int speler = 0; speler < this.aantalSpelers; speler++)
/*  99 */       for (int tegenSpeler = 0; tegenSpeler < this.aantalSpelers; tegenSpeler++) {
/* 100 */         if (tegenSpeler >= speler)
/*     */         {
/*     */           continue;
/*     */         }
/* 104 */         speelSpellen(speler, tegenSpeler, gespeeldeSetSpellen);
/* 105 */         gespeeldeSetSpellen++;
/* 106 */         speelSpellen(tegenSpeler, speler, gespeeldeSetSpellen);
/* 107 */         gespeeldeSetSpellen++;
/*     */       }
/*     */   }
/*     */ 
/*     */   private void speelSpellen(int speler, int tegenSpeler, int gespeeldeSetSpellen)
/*     */   {
/* 113 */     for (int i = 0; i < this.spellenPerTest; i++) {
/* 114 */       int winnaar = speelSpel(this.spelers[speler], this.spelers[tegenSpeler], speler, tegenSpeler);
/*     */ 
/* 116 */       if (winnaar == speler) {
/* 117 */         this.results[speler][tegenSpeler] += 2;
/*     */       }
/* 119 */       else if (winnaar == tegenSpeler) {
/* 120 */         this.results[tegenSpeler][speler] += 2;
/*     */       }
/*     */       else {
/* 123 */         this.results[speler][tegenSpeler] += 1;
/* 124 */         this.results[tegenSpeler][speler] += 1;
/*     */       }
/*     */ 
/* 127 */       int aantalSpellen = gespeeldeSetSpellen * this.spellenPerTest + i + 1;
/* 128 */       double percentage = aantalSpellen / this.totaalAantalSpellen * 100.0D;
/* 129 */       System.out.printf("%6.1f%% of all heks are played (%6d of %6d games)\n", new Object[] { Double.valueOf(percentage), Integer.valueOf(aantalSpellen), Integer.valueOf(this.totaalAantalSpellen) });
/*     */     }
/*     */   }
/*     */ 
/*     */   private int speelSpel(Strategie spelerAI, Strategie tegenSpelerAI, int speler, int tegenSpeler) {
/* 134 */     Spel spel = new Spel();
/* 135 */     int spelerAanDeBeurt = 2;
/* 136 */     Strategie spelerAIAanDeBeurt = spelerAI;
/* 137 */     while (!spel.isGameOver()) {
/* 138 */       int[][] bord = spel.geefBord();
/* 139 */       Bordbeschrijving bordbeschrijving = new Bordbeschrijving(bord, spelerAanDeBeurt);
/*     */ 
/* 141 */       AIBeurtInterface beurt = spelerAIAanDeBeurt.geefBesteBeurt(bordbeschrijving);
/*     */ 
/* 143 */       SpelBord spelBord = spel.geefSpelBord();
/* 144 */       ZetRij mogelijkeZetten = spelBord.getMogelijkeZetten(spelerAanDeBeurt);
/* 145 */       if (beurt.isPas()) {
/* 146 */         if (mogelijkeZetten.getAantalZetten() == 0) {
/* 147 */           spel.verwerkGedanePas(spelerAanDeBeurt);
/*     */         }
/*     */         else {
/* 150 */           printBord(bord);
/* 151 */           printMogelijkeZetten(mogelijkeZetten);
/* 152 */           System.out.printf("Ongeldige pas voor %s\n", new Object[] { spelerNaarString(spelerAanDeBeurt) });
/* 153 */           System.exit(0);
/*     */         }
/*     */       }
/*     */       else {
/* 157 */         Coordinaat coordinaat = new Coordinaat(beurt.geefX(), beurt.geefY());
/* 158 */         if (spel.isGeldigeZet(coordinaat, mogelijkeZetten)) {
/* 159 */           spel.verwerkGedaneZet(spelerAanDeBeurt, coordinaat);
/*     */         }
/*     */         else {
/* 162 */           printBord(bord);
/* 163 */           printMogelijkeZetten(mogelijkeZetten);
/* 164 */           System.out.printf("Ongeldige zet voor %s: (%d,%d)\n", new Object[] { spelerNaarString(spelerAanDeBeurt), Integer.valueOf(beurt.geefX()), Integer.valueOf(beurt.geefY()) });
/* 165 */           System.exit(0);
/*     */         }
/*     */       }
/* 168 */       spelerAanDeBeurt = spelerAanDeBeurt == 2 ? 1 : 2;
/* 169 */       spelerAIAanDeBeurt = spelerAIAanDeBeurt == spelerAI ? tegenSpelerAI : spelerAI;
/*     */     }
/* 171 */     return bepaalWinnaar(spel, speler, tegenSpeler);
/*     */   }
/*     */ 
/*     */   private String spelerNaarString(int spelerAanDeBeurt) {
/* 175 */     return spelerAanDeBeurt == 2 ? "zwart" : "wit";
/*     */   }
/*     */ 
/*     */   private void printMogelijkeZetten(ZetRij mogelijkeZetten) {
/* 179 */     System.out.printf("Mogelijke zetten: ", new Object[0]);
/* 180 */     if (mogelijkeZetten.getAantalZetten() == 0) {
/* 181 */       System.out.printf("geen mogelijke zetten -> pas werd verwacht\n\n", new Object[0]);
/* 182 */       return;
/*     */     }
/* 184 */     for (int i = 0; i < mogelijkeZetten.getAantalZetten(); i++) {
/* 185 */       Zet z = mogelijkeZetten.getZet(i);
/* 186 */       Coordinaat c = z.getGezetteSteen();
/* 187 */       System.out.printf("(%d,%d) ", new Object[] { Integer.valueOf(c.getX()), Integer.valueOf(c.getY()) });
/*     */     }
/* 189 */     System.out.printf("\n\n", new Object[0]);
/*     */   }
/*     */ 
/*     */   private void printBord(int[][] bord) {
/* 193 */     for (int i = 0; i < bord.length; i++) {
/* 194 */       for (int j = 0; j < bord[i].length; j++) {
/* 195 */         System.out.printf("[%d] ", new Object[] { Integer.valueOf(bord[i][j]) });
/*     */       }
/* 197 */       System.out.printf("\n", new Object[0]);
/*     */     }
/* 199 */     System.out.printf("\n", new Object[0]);
/*     */   }
/*     */ 
/*     */   private int bepaalWinnaar(Spel spel, int speler, int tegenSpeler) {
/* 203 */     int[][] bord = spel.geefBord();
/* 204 */     int aantalWit = telStenen(bord, 1);
/* 205 */     int aantalZwart = telStenen(bord, 2);
/* 206 */     if (aantalZwart > aantalWit) {
/* 207 */       return speler;
/*     */     }
/* 209 */     if (aantalWit > aantalZwart) {
/* 210 */       return tegenSpeler;
/*     */     }
/* 212 */     return -1;
/*     */   }
/*     */ 
/*     */   private int telStenen(int[][] bord, int kleur) {
/* 216 */     int resultaat = 0;
/* 217 */     for (int i = 0; i < bord.length; i++) {
/* 218 */       for (int j = 0; j < bord[i].length; j++) {
/* 219 */         if (bord[i][j] == kleur) {
/* 220 */           resultaat++;
/*     */         }
/*     */       }
/*     */     }
/* 224 */     return resultaat;
/*     */   }
/*     */ }

/* Location:           /Users/abaart/Downloads/competitie(2).jar
 * Qualified Name:     competitie.SpeelCompetitie
 * JD-Core Version:    0.6.0
 */